﻿
using dotNET.Utility;
using MySql.Data.MySqlClient;
using System;
using System.Data;
namespace dotNET.Data
{
    public class DbContext : IDbContext
    {
        readonly MySqlConnection conn;
        IDbTransaction _transaction = null;
        public IDbConnection Connection { get { return conn; } }

        public IDbTransaction Transaction { get { return _transaction; } }

        public DbContext(string connstring)
        {
            conn = new MySqlConnection(connstring);
            Open();
        }

        public void Open()
        {
            if (conn.State == ConnectionState.Closed)
                conn.Open();
        }

        public void BeginTransaction()
        {
            _transaction = conn.BeginTransaction();
        }

        public void Commit()
        {
            _transaction.Commit();
            _transaction = null;
        }

        public void Rollback()
        {
            _transaction.Rollback();
            _transaction = null;
        }

        public void Close()
        {
            if (_transaction != null)
                _transaction.Dispose();
            if (conn.State == ConnectionState.Open)
                conn.Close();
        }

        #region IDisposable Support
        //private bool disposedValue = false; // 要检测冗余调用

        //protected virtual void Dispose(bool disposing)
        //{
        //    if (!disposedValue)
        //    {
        //        if (disposing)
        //        {
        //            // TODO: 释放托管状态(托管对象)。
        //            if (_transaction != null)
        //                _transaction.Dispose();
        //        }

        //        if (conn.State == ConnectionState.Open)
        //            conn.Close();

        //        // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
        //        // TODO: 将大型字段设置为 null。

        //        disposedValue = true;
        //    }
        //}

        // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
        // ~DbContext() {
        //   // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
        //   Dispose(false);
        // }

        // 添加此代码以正确实现可处置模式。
        public void Dispose()
        {
            // TODO: 释放托管状态(托管对象)。
            if (_transaction != null)
                _transaction.Dispose();


            if (conn.State == ConnectionState.Open)
                conn.Close();
            // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
            //Dispose(true);
            // TODO: 如果在以上内容中替代了终结器，则取消注释以下行。
            GC.SuppressFinalize(this);
        }
        #endregion
    }
}
